package com.miku.springaialibabamcpclient;

import org.springframework.ai.chat.client.ChatClient; // 导入 Spring AI 的 ChatClient 类，用于与聊天模型交互
import org.springframework.ai.chat.model.ChatModel; // 导入 Spring AI 的 ChatModel 接口，代表一个聊天模型
import org.springframework.ai.tool.ToolCallbackProvider; // 导入 Spring AI 的 ToolCallbackProvider 接口，用于提供工具回调
import org.springframework.beans.factory.annotation.Qualifier; // 导入 Spring 的 Qualifier 注解，用于指定注入特定名称的 Bean
import org.springframework.boot.CommandLineRunner; // 导入 Spring Boot 的 CommandLineRunner 接口，用于在应用启动后执行特定代码
import org.springframework.boot.SpringApplication; // 导入 Spring Boot 的主应用类
import org.springframework.boot.autoconfigure.SpringBootApplication; // 导入 Spring Boot 的主应用注解，启用自动配置、组件扫描等
import org.springframework.context.ConfigurableApplicationContext; // 导入 Spring 的应用上下文接口，用于管理 Bean 生命周期等
import org.springframework.context.annotation.Bean; // 导入 Spring 的 Bean 注解，用于声明一个 Bean

// @SpringBootApplication 注解标记这是一个 Spring Boot 应用程序
@SpringBootApplication
public class SpringAiAlibabaMcpClientApplication {

	// main 方法是应用程序的入口点
	public static void main(String[] args) {
		// 启动 Spring Boot 应用程序
		SpringApplication.run(SpringAiAlibabaMcpClientApplication.class, args);
	}

	// @Bean 注解将此方法的返回值注册为 Spring 容器中的一个 Bean
	// CommandLineRunner 接口使得这个 Bean 在应用程序启动后会自动执行 run 方法
	@Bean
	public CommandLineRunner predefineQuestions(
			// @Qualifier("dashscopeChatModel") 注解指定注入名称为 "dashscopeChatModel" 的 ChatModel Bean
			// 这个 Bean 通常由 spring-ai-alibaba-starter 自动配置提供，代表阿里云的 DashScope 模型
			@Qualifier("dashscopeChatModel") ChatModel dashscopeChatModel,
			// 注入 ToolCallbackProvider Bean，这个 Bean 通常由 spring-ai-mcp-client-spring-boot-starter 自动配置提供
			// 它负责管理和调用通过 MCP 连接的工具
			ToolCallbackProvider tools,
			// 注入 ConfigurableApplicationContext，用于在任务完成后关闭应用上下文
			ConfigurableApplicationContext context) {

		// 返回一个 CommandLineRunner 实例
		return args -> {
			// 使用 ChatClient.builder() 创建一个 ChatClient 构建器
			// 将注入的 dashscopeChatModel 设置为 ChatClient 使用的聊天模型
			ChatClient.Builder builder = ChatClient.builder(dashscopeChatModel);

			// 使用 defaultTools(tools) 方法将注入的 ToolCallbackProvider (MCP 客户端) 注册到 ChatClient 中
			// 这使得 ChatClient 在需要时能够通过 MCP 调用工具
			var chatClient = builder.defaultTools(tools).build();

			// 定义用户输入的硬编码中文问题
			// 硬编码可以避免配置文件编码问题，但实际应用中通常从外部获取输入
//			String userInput = "查询用户16Miku的github仓库每个代码仓库的详细内容？";

			String userInput =
					"datasource:\n" +
					"\n" +
					"url: jdbc:mysql://localhost:3306/springai-alibaba-agent?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai\n" +
					"\n" +
					"username: root\n" +
					"\n" +
					"password: 123456\n" +
					"\n" +
					"driver-class-name: com.mysql.cj.jdbc.Driver\n" +
					"\n" +
					"根据配置信息连接数据库，并查询库中所有表的全部数据";

			// 打印问题到控制台
			System.out.println("Question" + userInput );

			// 使用 chatClient 发送 prompt (问题)
			// .call() 方法发送请求到配置的 ChatModel (DashScope)
			// 如果模型判断需要使用工具，Spring AI 框架会通过注册的 ToolCallbackProvider (MCP) 调用工具
			// .content() 方法获取 AI 模型返回的文本内容 (可能是直接回答或工具执行结果的总结)
			// 打印 AI 模型返回的回答到控制台
			System.out.println("Answer" + chatClient.prompt(userInput).call().content());

			// 在任务完成后关闭 Spring 应用程序上下文
			// 这对于 CommandLineRunner 类型的单次执行任务很有用，避免应用程序一直运行
			context.close();
		};
	}
}
